//################################################################################
// MIT License
// Copyright (c) 2024 ZhangYihua
//
// Change Logs:
// Date           Author       Notes
// 2020-10-17     ZhangYihua   first version
//
// Description  : 
//################################################################################

module file2data #(
parameter           FILE                    = "file.txt",   // file path and name
parameter           FORMAT                  = "%h",         // data format
parameter           DW                      = 16,           // data width
parameter           DLY_NUM                 = 0             // delay number
) ( 
input                                       rst_n,
input                                       clk,
input                                       cke,

output  tri1                                done,   // 1'b0: file uncompleted; 1'b1: file completed
output  reg         [DW-1:0]                data    // data converted from file
);

//################################################################################
// define local varialbe and localparam
//################################################################################
reg                                         oe_n;
reg                                         vld;
integer                                     cnt;

//################################################################################
// main
//################################################################################

initial begin:RD_OUT
    integer fd;
    reg [DW-1:0] data_c;

    data = {DW{1'b0}};
    vld  = 1'b0;
    oe_n = 1'b0;        // force done to 1'b0;
    cnt  = 0;

    fd = $fopen(FILE, "r");

    @(posedge rst_n);

    repeat(DLY_NUM) begin
        @(posedge clk);
        while(cke!=1'b1) begin
            @(posedge clk);
        end
    end

    while($fscanf(fd, FORMAT, data_c)==1) begin
        data =`U_DLY data_c;
        vld  =`U_DLY 1'b1;
        cnt = cnt+1;

        @(posedge clk);
        while(cke!=1'b1) begin
            @(posedge clk);
        end
    end

    data =`U_DLY {DW{1'b0}};
    vld  =`U_DLY 1'b0;
    oe_n =`U_DLY 1'b1;        // releas done to 1'bz;

    if (!$feof(fd)) begin
        $error("Unknow format encountered inside %s!!!!", FILE);
        $stop;
    end

    $fclose(fd);
end

assign done = (oe_n==1'b0) ? 1'b0 : 1'bz;

//################################################################################
// ASSERTION
//################################################################################

`ifdef CBB_ASSERT_ON
// synopsys translate_off


// synopsys translate_on
`endif

endmodule
